package br.com.Bolao.application.controller.apostas;

import br.com.Bolao.application.controller.BaseController;
import br.com.Bolao.application.controller.usuarios.UsuarioService;
import br.com.Bolao.application.dao.apostas.ApostaDAO;
import br.com.Bolao.application.dao.equipes.EquipeDAO;
import br.com.Bolao.application.dao.usuarios.UsuarioDAO;
import br.com.Bolao.application.util.DataUtil;
import br.com.Bolao.model.Aposta;
import br.com.Bolao.model.Equipe;
import java.io.Serializable;
import java.util.List;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;

/**
 * Controller da página APOSTAS.XHTML
 * @author frederico.cruz
 */
@Scope(ScopeType.SESSION)
@Name("apostaAction")
public class ApostasController extends BaseController implements Serializable{

    @In
    private UsuarioDAO usuarioDAO;
    @In
    private ApostaDAO apostaDAO;
    @In
    private EquipeDAO equipeDAO;
    @In
    private UsuarioService usuarioService;

    private Integer campeaoSelecionado;
    private Integer viceSelecionado;
    private DataModel listaApostas;
    private String login;
    private List<Equipe> listaEquipes;
    private Aposta aposta;
    private final Integer DETALHA_PONTUACAO = 1;

    /**
     * Método de inicialização do UC.
     * @param loginIn
     * @return
     */
    public String setup(String loginIn, Integer paramPage) {
        aposta = new Aposta();
        listaEquipes = equipeDAO.obterTodos();
        login = loginIn;
        Equipe campeao = (usuarioDAO.obterPorUsuario(login)).getCampeao();
        Equipe vicecampeao = (usuarioDAO.obterPorUsuario(login)).getVicecampeao();
        if (campeao != null) {
            campeaoSelecionado = campeao.getIdEquipe();
        }
        if (vicecampeao != null) {
            viceSelecionado = vicecampeao.getIdEquipe();
        }
        if (paramPage.equals(DETALHA_PONTUACAO)) {
            return "detalhe_pontuacao";
        } else {
            return "apostar";
        }
    }
   
    public void apostarCampeao() {
        try {
            String nomeEquipe = usuarioService.apostarCampeao(campeaoSelecionado);
            adicionarMensagemInformacao(nomeEquipe + " campeão(ã)? Será? Boa Sorte!");
        } catch (Exception e) {
            adicionarMensagemErro("Ocorreu um erro durante a aposta : " + e.getMessage());
        }
    }

    public void apostarVice() {
        try {
            usuarioService.apostarVice(viceSelecionado);
            adicionarMensagemInformacao("Aposta feita com sucesso!");
        } catch (Exception e) {
            adicionarMensagemErro("Ocorreu um erro durante a aposta : " + e.getMessage());
        }
    }

    /**
     * Método que habilita/desabilita botão "apostar" de acordo com a data
     * inicio do torneio.
     * Após a data do jogo não é permito alterar as apostas.
     * @param aposta
     * @return boolean true = Válido ou false = Inválido
     */
    public boolean validarDataAposta(Aposta aposta) {
        DataUtil dataUtil = new DataUtil();
        if ((aposta.getFkJogo().getDataJogo()).before(dataUtil.obtemDataAtual())) {
            return false;
        } else {
            return true;
        }
    }

    /*
     * GETs e SETs
     */
    public DataModel getListaApostas() {
        return listaApostas = new ListDataModel(apostaDAO.obterJogosPorUsuario(usuarioDAO.obterPorUsuario(login)));
    }

    public void setListaApostas(DataModel listaApostas) {
        this.listaApostas = listaApostas;
    }

    public Aposta getAposta() {
        return aposta;
    }

    public void setAposta(Aposta aposta) {
        this.aposta = aposta;
    }

    public Integer getCampeaoSelecionado() {
        return campeaoSelecionado;
    }

    public void setCampeaoSelecionado(Integer campeaoSelecionado) {
        this.campeaoSelecionado = campeaoSelecionado;
    }

    public List<Equipe> getListaEquipes() {
        return listaEquipes;
    }

    public void setListaEquipes(List<Equipe> listaEquipes) {
        this.listaEquipes = listaEquipes;
    }

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public Integer getViceSelecionado() {
        return viceSelecionado;
    }

    public void setViceSelecionado(Integer viceSelecionado) {
        this.viceSelecionado = viceSelecionado;
    }
}
